#include "context.h"
#include "zoneinterface.h"


namespace Optra { namespace Extensions{

class ContextPrivate{
	public:
	ContextPrivate():
	bridge(0)
	,config(0)
	,interface(0){
		userDir = QDir::home();
	}
	~ContextPrivate()
	{
		delete config;
	}
		Opl::Core::EntityObject* bridge;
		QDir binDir;
		QDir configDir;
		QDir rootDir;
		QDir resourcesDir;
		QDir userDir;
		Opl::Core::IConfig* config;
		ZoneInterface* interface;
};

Context::Context(Opl::Core::EntityObject *parent) :
	Opl::Core::EntityObject(parent), O_PRIVATE_CREATE(Context)
{

}


Context::Context(ZoneInterface* inf, Opl::Core::EntityObject *parent) :
	Opl::Core::EntityObject(parent), O_PRIVATE_CREATE(Context)
{
	O_D(Context);
	d->interface = inf;
}

Context::~Context()
{
	O_PRIVATE_DELETE;
}

 ZoneInterface* Context::inf()const
 {
     O_C(Context);
     return d->interface;
 }

 QString Context::userDir()const
 {
     O_C(Context);
     return d->userDir.absolutePath();
 }

 void Context::setUserDir(const QDir& dir)
 {
     O_D(Context);
     d->userDir = dir;
     if (!dir.exists())
     {
         QDir m;
         m.mkpath(dir.absolutePath());
     }
 }

 void Context::setInterface(ZoneInterface* inf)
 {
     O_D(Context);
     d->interface = inf;
 }

void Context::setBridge(Opl::Core::EntityObject* b)
{
    O_D(Context);
    d->bridge = b;
}

Opl::Core::EntityObject* Context::bridge()const
{
    O_C(Context);
    return d->bridge;

}

QDir Context::rootDir()const
{
    O_C(Context);
    return d->rootDir;

}

void Context::setRootDir(const QDir& dir)
{
    O_D(Context);
    d->rootDir = dir;
}

QString Context::resourcesDir()const
{
    O_C(Context);
    return d->resourcesDir.absolutePath();
}

void Context::setResourcesDir(const QDir& dir)
{
    O_D(Context);
    d->resourcesDir = dir;
}


QString Context::binDir()const
{
    O_C(Context);
    return d->binDir.absolutePath();

}

void Context::setBinDir(const QDir& dir)
{
    O_D(Context);
    d->binDir = dir;
}

QString Context::configDir()const
{
    O_C(Context);
    return d->configDir.absolutePath();
}

void Context::setConfigDir(const QDir& dir)
{
    O_D(Context);
    d->configDir = dir;
}

Opl::Core::IConfig* Context::config()const
{
    O_C(Context);
    return d->config;
}

void Context::setConfig(Opl::Core::IConfig* cfg)
{
    O_D(Context);
    d->config = cfg;
}


QString Context::toString()
{
    O_D(Context);
    QString out;
    out.append(Opl::Core::Entity::toString());
    out.append("\n");
    out.append(QString("Root Dir:%1\n").arg(rootDir().absolutePath()));
    out.append(QString("Bin Dir:%1\n").arg(binDir()));
    out.append(QString("Config Dir:%1\n").arg(configDir()));
    out.append(QString("Resources Dir:%1\n").arg(resourcesDir()));
    out.append(QString("Interface:%1\n").arg((int)inf()));
    out.append(QString("Bridge:%1\n").arg((int)bridge()));
    return out;
}


}}
